package com.songlei.rtcadriondh265demo.utils

import android.content.Context
import org.webrtc.Camera1Enumerator
import org.webrtc.Camera2Enumerator
import org.webrtc.CameraEnumerator
import org.webrtc.VideoCapturer

// 定义单例对象（工具类），用于封装摄像头相关操作
object CameraUtil {

    /**
     * 创建视频采集器（兼容Camera1/Camera2 API）
     * @param context Android上下文（可为null，但建议传入有效上下文）
     * @return 视频采集器实例，可能为null（当设备无可用摄像头时）
     */
    fun createVideoCapture(context: Context?): VideoCapturer? {
        // 根据设备支持的Camera API类型选择不同的摄像头枚举器
        val videoCapture: VideoCapturer? = if (Camera2Enumerator.isSupported(context)) {
            // 使用Camera2 API（适用于Android 5.0+，性能更好）
            createCameraCapture(Camera2Enumerator(context))
        } else {
            // 降级使用Camera1 API（兼容旧设备）
            createCameraCapture(Camera1Enumerator(true))  // true表示启用摄像头切换支持
        }
        return videoCapture
    }

    /**
     * 创建具体的摄像头采集器
     * @param enumerator 摄像头枚举器（Camera1或Camera2实现）
     * @return 视频采集器实例，可能为null
     */
    private fun createCameraCapture(enumerator: CameraEnumerator): VideoCapturer? {
        // 获取设备上所有可用的摄像头名称列表
        val deviceNames = enumerator.deviceNames

        // 策略1：优先寻找前置摄像头
        for (deviceName in deviceNames) {
            // 检查当前摄像头是否为前置摄像头
            if (enumerator.isFrontFacing(deviceName)) {
                // 尝试创建该摄像头的采集器
                val videoCapture: VideoCapturer? = enumerator.createCapturer(
                    deviceName,  // 摄像头设备名称
                    null         // 事件处理器（这里传null表示不处理摄像头事件）
                )
                // 如果成功创建则直接返回
                if (videoCapture != null) {
                    return videoCapture
                }
            }
        }

        // 策略2：如果找不到前置摄像头，则尝试其他摄像头
        for (deviceName in deviceNames) {
            // 排除已经检查过的前置摄像头
            if (!enumerator.isFrontFacing(deviceName)) {
                val videoCapture: VideoCapturer? = enumerator.createCapturer(deviceName, null)
                if (videoCapture != null) {
                    return videoCapture
                }
            }
        }

        // 没有找到任何可用摄像头时返回null
        return null
    }
}